package web

import (
	"context"
	"net/http"
)

const XFRMClientHeader = "X-Frm-Client"

// XFRMClientInfo
// 注意，ParseXFRMClientInfo() 中只支持了 int32 与 string 两种类型。
// 添加/修改字段的话，需要相应修改 ParseXFRMClientInfo() 函数。
// json 用于标记该字段在 header `X-FRM-Client` 中的名字。
type XFRMClientInfo struct {
	// os-family, 操作系统。 Android，iOS
	OsFamily string `json:"os-family"`
	// os-version, 操作系统版本。
	OsVersion string `json:"os-version"`
	// device-id, 设备唯一标识
	DeviceId string `json:"device-id"`
	// device-type, 设备类型。Mobile:手机; Pad:平板
	DeviceType string `json:"device-type"`
	// device-brand, 设备品牌。Huawei:华为; mi:小米; apple:苹果...
	DeviceBrand string `json:"device-brand"`
	// device-model, 设备型号。iPhone 12, Huawei
	DeviceModel string `json:"device-model"`
	// app-type, 客户端类型。native:原生应用; web:h5; wechat-miniprogram:微信小程序
	AppType string `json:"app-type"`
	// app-version, 客户端app的版本号，如:v1.0.0(build.1)
	AppVersion string `json:"app-version"`
	// app-channel, 应用渠道。huawei, appstore, xiaomi
	AppChannel string `json:"app-channel"`
	// app-build-number, app构建号
	AppBuildNumber string `json:"app-build-number"`
	// source, 产品标识。1:xingyu
	Source EnumSource `json:"source"`
	// Zone, 时区
	Zone int32 `json:"zone"`
	// 客户端时间戳
	Timestamp int64 `json:"timestamp"`
	// 语言码。参考 https://zh.wikipedia.org/wiki/ISO_639-1
	LanguageCode string `json:"language-code"`

	Ip     string `json:"ip"`
	Region string `json:"region"`
	Host   string `json:"host"`
} //@name 客户端信息

func (m XFRMClientInfo) ToHeaderValue() string {
	return ToHeaderValue(m)
}

func ParseXFRMClientInfo(ctx context.Context, raw string) (XFRMClientInfo, error) {
	var item XFRMClientInfo
	err := ParseXFRMHeader(ctx, raw, &item)
	if err != nil {
		return XFRMClientInfo{}, err
	}
	return item, nil
}
func GetRawXFRMClientInfoFromRequest(ctx context.Context, req *http.Request) string {
	return req.Header.Get(XFRMClientHeader)
}
func GetXFRMClientInfoFromRequest(ctx context.Context, req *http.Request) (XFRMClientInfo, error) {
	raw := GetRawXFRMClientInfoFromRequest(ctx, req)
	return ParseXFRMClientInfo(ctx, raw)
}

type EnumSource int

const (
	//xingyu
	EnumSource_Xingyu EnumSource = 1
	//taskmgr
	EnumSource_Taskmgr EnumSource = 2
)

type EnumAuthType int

const (
	//每次刷新token
	EnumAuthType_RefreshNew EnumAuthType = 1
)
